import xmltodict
from docx import Document

# 打开docx文档
docx_path = '序号测试.docx'
document = Document(docx_path)
numbering_abs_fmt_dict = {}
numbering_fmt_dict = {}

# 获取题号样式
numbering_part = document.part.numbering_part
# 获取numbering.xml文件中的信息
ct_numbering = numbering_part.element
numbering_dict = xmltodict.parse(ct_numbering.xml, force_list=('w:lvl',))
print(type(numbering_dict), numbering_dict)
num_ids = ct_numbering.xpath('./w:num/@w:numId')
if numbering_dict and numbering_dict.get('w:numbering'):
    absnum = numbering_dict['w:numbering'].get('w:abstractNum')
    num = numbering_dict['w:numbering'].get('w:num')
    num_dict = dict([i['@w:numId'], i['w:abstractNumId'].get('@w:val')] for i in num)
    for i in absnum:
        numbering_abs_fmt_dict[i['@w:abstractNumId']] = {
            'multi_level_type': i.get('w:multiLevelType').get('@w:val'),
            'lvl': {lvl.get('@w:ilvl'): {
                'ilvl': lvl.get('@w:ilvl'),
                'num_fmt': lvl.get('w:numFmt').get('@w:val'),
                'start': int(lvl.get('w:start').get('@w:val')),
                'lvl_text': lvl.get('w:lvlText').get('@w:val'),

            }
                for lvl in i.get('w:lvl')},
        }
    print(numbering_abs_fmt_dict)
    for k, v in num_dict.items():
        if numbering_abs_fmt_dict.get(v):
            numbering_fmt_dict[k] = numbering_abs_fmt_dict.get(v)
print(numbering_fmt_dict)
absnum_ids = ct_numbering.xpath('./w:num/w:abstractNumId/@w:val')

x = {'0': {'multi_level_type': 'singleLevel',
           'lvl': {'0': {'ilvl': '0', 'num_fmt': 'decimal', 'start': 1, 'lvl_text': '(%1)'}}},
     '1': {'multi_level_type': 'singleLevel',
           'lvl': {'0': {'ilvl': '0', 'num_fmt': 'decimal', 'start': 1, 'lvl_text': '%1．'}}},
     '2': {'multi_level_type': 'singleLevel',
           'lvl': {'0': {'ilvl': '0', 'num_fmt': 'decimal', 'start': 1, 'lvl_text': '%1.'}}},
     '3': {'multi_level_type': 'singleLevel',
           'lvl': {'0': {'ilvl': '0', 'num_fmt': 'decimal', 'start': 1, 'lvl_text': '%1)'}}},
     '4': {'multi_level_type': 'singleLevel',
           'lvl': {'0': {'ilvl': '0', 'num_fmt': 'decimal', 'start': 1, 'lvl_text': '%1.'}}},
     '5': {'multi_level_type': 'singleLevel',
           'lvl': {'0': {'ilvl': '0', 'num_fmt': 'chineseCounting', 'start': 1, 'lvl_text': '%1、'}}},
     '6': {'multi_level_type': 'singleLevel',
           'lvl': {'0': {'ilvl': '0', 'num_fmt': 'upperLetter', 'start': 1, 'lvl_text': '%1.'}}},
     '7': {'multi_level_type': 'singleLevel',
           'lvl': {'0': {'ilvl': '0', 'num_fmt': 'chineseCounting', 'start': 1, 'lvl_text': '（%1）'}}}}
